from django.contrib.auth import REDIRECT_FIELD_NAME
from django.template import RequestContext
from django.shortcuts import render_to_response
from django.http import HttpResponseRedirect
from django.utils.translation import ugettext as _
from django.contrib.auth.decorators import login_required
from django.http import HttpResponse, Http404
from saip.usuario.models import Usuario
from saip.usuario.models import Rol
from saip.usuario.models import Permiso
from saip.usuario.models import UsRolPro
#from saip.usuario.forms import *
from saip.usuario.forms import UsuarioEditForm
from saip.usuario.forms import ChangePassForm
from saip.usuario.forms import RolEditForm
from saip.usuario.forms import RegistrationForm
from saip.usuario.forms import RolAsAdForm
from saip.usuario.forms import RolAdmForm
from saip.usuario.forms import RolOpForm
from saip.usuario.forms import SearchForm
#from saip.usuario.models import *

def main_page(request):
    """
    Habilita las vistas y los botones correspondientes, de acuerdo a los permisos que posee
    un usuario.
    """
#    try:
#        rol = Rol.objects.all()
#    except Rol.DoesNotExist:
#        raise Http404(u'Requested rol not found.')
#    return render_to_response(
#        'main_page.html', RequestContext(request)
#    )	
    usuariotag = False
    roltag = False
    proyectotag = False
    desarrollotag = False
    tipoartgraltag = False
    admin = False
    lusuario = False
    cusuario = False
    musuario = False
    eusuario = False
    lrol = False
    crol = False
    mrol = False
    erol = False
    lproyecto = False
    cproyecto = False
    mproyecto = False
    eproyecto = False
    ltipoartgral = False
    ctipoartgral = False
    mtipoartgral = False
    etipoartgral = False
    asigadm = False
	
    try:
        #obtiene el usuario logueado actualmente
        usuario = Usuario.objects.get(username=request.user.username)
        roles = usuario.usuario_rol.all()#todos los roles que tiene ese usuario
        for rol in roles:
            #raise Http404(u'Requested rol not found.')
            perms = rol.rol_permiso.all()
            for perm in perms:
                if perm.id == 1:#rol de admin
                    usuariotag = True
                    lusuario = True
                    cusuario = True
                    musuario = True
                    eusuario = True
                    admin = True
                    roltag = True
                    lrol = True
                    crol = True
                    mrol = True
                    erol = True
                    proyectotag = True
                    lproyecto = True
                    cproyecto = True
                    mproyecto = True
                    eproyecto = True
                    asigadm = True
                    tipoartgraltag = True  
                    ltipoartgral = True
                    ctipoartgral = True
                    mtipoartgral = True
                    etipoartgral = True
                elif perm.id == 2:
                    lusuario = True
                    usuariotag = True
                elif perm.id == 3:
                    cusuario = True
                    lusuario = True
                    usuariotag = True
                elif perm.id == 4:
                    musuario = True
                    lusuario = True
                    usuariotag = True
                elif perm.id == 5:
                    eusuario = True
                    lusuario = True
                    usuariotag = True
                elif perm.id == 6:
                    lrol = True
                    roltag = True
                elif perm.id == 7:
                    crol = True
                    lrol = True
                    roltag = True
                elif perm.id == 8:
                    mrol = True
                    lrol = True
                    roltag = True
                elif perm.id == 9:
                    erol = True
                    lrol = True
                    roltag = True
                elif perm.id == 10:
                    lproyecto = True
                    proyectotag = True
                elif perm.id == 11:
                    cproyecto = True
                    lproyecto = True
                    proyectotag = True
                elif perm.id == 12:
                    mproyecto = True
                    lproyecto = True
                    proyectotag = True
                elif perm.id == 13:
                    eproyecto = True
                    lproyecto = True
                    proyectotag = True
#/&////////////////////////////////////////////////////
                elif perm.id == 38:
                    ltipoartgral = True
                    tipoartgraltag = True        
                elif perm.id == 39:
                    ltipoartgral = True
                    ctipoartgral = True
                    tipoartgraltag = True
                elif perm.id == 40:
                    ltipoartgral = True
                    mtipoartgral = True
                    tipoartgraltag = True
                elif perm.id == 41:
                    ltipoartgral = True
                    etipoartgral = True
                    tipoartgraltag = True
#///////////////////////////////////////////////////////
                elif perm.tipo == 'O':
                    desarrollotag = True
                
    except:
        #raise Http404(u'Requested rol not found.')
        return render_to_response(
            'main_page.html', RequestContext(request)
        )
    variables = RequestContext(request, {
        #'perms': perms,
        #'usuarios': usuarios,
		#'tipoadr': 'user_delete'
        'usuariotag':usuariotag,
        'roltag':roltag,
        'proyectotag':proyectotag,
        'desarrollotag':desarrollotag,
        'tipoartgraltag':tipoartgraltag,
        'admin':admin,
        'lusuario':lusuario,
        'cusuario':cusuario,
        'musuario':musuario,
        'eusuario':eusuario,
        'lrol':lrol,
        'crol':crol,
        'mrol':mrol,
        'erol':erol,
        'lproyecto':lproyecto,
        'cproyecto':cproyecto,
        'mproyecto':mproyecto,
        'eproyecto':eproyecto,
        'ltipoartgral':ltipoartgral,
        'ctipoartgral':ctipoartgral,
        'mtipoartgral':mtipoartgral,
        'etipoartgral':etipoartgral,
        'asigadm':asigadm,
    })
    return render_to_response('main_page.html', variables)

def logout(request, next_page=None, template_name='registration/logged_out.html', redirect_field_name=REDIRECT_FIELD_NAME):
    """
    Cierra la sesion del usuario y muestra el mensaje 'Gracias por utilizar nuestra web'.
    Despliega la opcion 'Iniciar sesion de nuevo'.
    """
    "Logs out the user and displays 'You are logged out' message."
    from django.contrib.auth import logout
    logout(request)
    if next_page is None:
        redirect_to = request.REQUEST.get(redirect_field_name, '')
        if redirect_to:
            return HttpResponseRedirect(redirect_to)
        else:
            return render_to_response(template_name, {
                'title': _('Logged out')
            }, context_instance=RequestContext(request))
    else:
        # Redirect to this page until the session has been cleared.
        return HttpResponseRedirect(next_page or request.path)

def logout_page(request):
    """
    Se dirige a la pagina de cierre de sesion.
    """
    logout(request)
    return HttpResponseRedirect('/')
    
@login_required
def change_password(request):
    """
    Vista para el cambio de contrasenya del usuario.
    """
    if request.method == 'POST':
        usuario = Usuario.objects.get(username=request.user.username)
        form = ChangePassForm(request.POST)
        if form.is_valid():
            usuario.set_password(form.cleaned_data['password1'])
            usuario.save()
            return HttpResponseRedirect('/user_save/success/')
    else:
        username = request.user.username
        usuario = Usuario.objects.get(username=username)
        form = ChangePassForm()
    variables = RequestContext(request, {'form': form, 'usuario': usuario})
    return render_to_response('change_pass.html', variables)    

@login_required
def crear_usuario(request):
    """
    Vista que despliega los campos para introducir los datos del nuevo usuario. 
    """
    if request.method == 'POST':
        form = RegistrationForm(request.POST)
        if form.is_valid():
            user = Usuario.objects.create_user(
                username=form.cleaned_data['username'],
                password=form.cleaned_data['password1'],
                email=form.cleaned_data['email']
            )
            usuario = Usuario.objects.get(username=form.cleaned_data['username'])
            usuario.nombre = form.cleaned_data['nombre']
            usuario.apellido = form.cleaned_data['apellido']
            usuario.direccion = form.cleaned_data['direccion']
            usuario.telefono = form.cleaned_data['telefono']
            usuario.save()
            
            return HttpResponseRedirect('/user_read/')
    else:
        form = RegistrationForm()
    variables = RequestContext(request, {
        'form': form
    })
    return render_to_response(
        'usuario/user_save.html',
        variables
    )

@login_required
def editar_usuario(request):
    """
    Vista que despliega los campos para modificar los datos de un usuario registrado. 
    """
    show_user_list = False
    idUser = 0
    if request.method == 'POST':
        user_edit_form = UsuarioEditForm(request.POST)
        idUser = request.POST['idUser']
        if user_edit_form.is_valid():
            user = Usuario.objects.get(id=idUser)
            user.username = user_edit_form.cleaned_data['username']
            user.nombre = user_edit_form.cleaned_data['nombre']
            user.apellido = user_edit_form.cleaned_data['apellido']
            user.direccion = user_edit_form.cleaned_data['direccion']
            user.email = user_edit_form.cleaned_data['email']
            user.telefono = user_edit_form.cleaned_data['telefono']

            user.save()
            return HttpResponseRedirect('/user_edit/')
    elif 'username' in request.GET:
        user = Usuario.objects.get(username=request.GET['username'])
        user_edit_form = UsuarioEditForm(initial={'iduser':user.id, 'username': user.username, 'nombre': user.nombre, 'apellido': user.apellido, 'email': user.email, 'direccion': user.direccion, 'telefono': user.telefono})
        #user_edit_form = RegistrationForm()
        idUser = user.id
        usuarios = Usuario.objects.filter(is_active=True)
        variables = RequestContext(request, {
            'show_user_list': False,
            'usuarios': usuarios,
            'idUser': idUser,
            'tipoadr': 'user_edit',
            'user_edit_form': user_edit_form
        })
        return render_to_response('editar_user.html', variables)
    else:
        # formulario inicial
        user_edit_form = UsuarioEditForm()
        show_user_list = True
    if 'buscar' in request.GET:
        searchform = SearchForm(request.GET)
        buscar = request.GET['buscar'].strip()
        usuarios = Usuario.objects.filter(is_active=True).filter(username__icontains=buscar)
    else:
        usuarios = Usuario.objects.filter(is_active=True)
        searchform = SearchForm()
    variables = RequestContext(request, {
        'show_user_list': show_user_list,
        'usuarios': usuarios,
        'tipoadr': 'user_edit',
        'idUser': idUser,
        'searchform': searchform,
        'user_edit_form': user_edit_form
    })
    return render_to_response('editar_user.html', variables)

@login_required
def leer_usuario(request):
    """
    Vista que despliega una lista que contiene todos los usuarios registrados en el sistema. 
    """
    if request.method == 'POST':
        user = Usuario.objects.get(username=request.POST['username'])
        user.is_active = False
        #user.save()
        return HttpResponseRedirect('/user_read/')
    elif 'username' in request.GET:
        user = Usuario.objects.get(username=request.GET['username'])
        user_edit_form = UsuarioEditForm({'username': user.username , 'nombre': user.nombre, 'apellido':user.apellido, 'direccion':user.direccion, 'email':user.email, 'telefono':user.telefono})
        usuarios = Usuario.objects.filter(is_active=True)
        variables = RequestContext(request, {
            'show_user_list': False,
            'usuarios': usuarios,
            'tipoadr': 'user_read',
            'user_edit_form': user_edit_form
        })
        return render_to_response('read_user.html', variables)
    else:
        user_edit_form = UsuarioEditForm()
    if 'buscar' in request.GET:
        searchform = SearchForm(request.GET)
        buscar = request.GET['buscar'].strip()
        usuarios = Usuario.objects.filter(is_active=True).filter(username__icontains=buscar)
    else:
        usuarios = Usuario.objects.filter(is_active=True)
        searchform = SearchForm()
    variables = RequestContext(request, {
        'show_user_list': True,
        'usuarios': usuarios,
        'searchform': searchform,
		'tipoadr': 'user_read'
    })
    return render_to_response('read_user.html', variables)

@login_required
def eliminar_usuario(request):
    """
    Vista que despliega una lista que contiene todos los usuarios registrados en el sistema, los usuarios seleccionados
    podran ser eliminados. 
    """
    if request.method == 'POST':
        user = Usuario.objects.get(username=request.POST['username'])
        user.is_active = False
        user.save()
        return HttpResponseRedirect('/user_delete/')
    elif 'username' in request.GET:
        usuario = Usuario.objects.get(username=request.GET['username'])
        #user_edit_form = UsuarioEditForm({'username': user.username , 'nombre': user.nombre, 'apellido':user.apellido, 'direccion':user.direccion, 'email':user.email, 'telefono':user.telefono})
        usuarios = Usuario.objects.filter(is_active=True)
        variables = RequestContext(request, {
            'show_user_list': False,
            'usuarios': usuarios,
            'tipoadr': 'user_delete',
            'usuario': usuario
        })
        return render_to_response('delete_user.html', variables)
    else:
        user_edit_form = UsuarioEditForm()
    if 'buscar' in request.GET:
        searchform = SearchForm(request.GET)
        buscar = request.GET['buscar'].strip()
        usuarios = Usuario.objects.filter(is_active=True).exclude(id=1).filter(username__icontains=buscar)
    else:
        usuarios = Usuario.objects.filter(is_active=True).exclude(id=1)
        searchform = SearchForm()
    variables = RequestContext(request, {
        'show_user_list': True,
        'usuarios': usuarios,
        'searchform': searchform,
		'tipoadr': 'user_delete'
    })
    return render_to_response('delete_user.html', variables)
	
	
@login_required	
def rol_save_page(request):
    """
    Vista que despliega los campos para introducir los datos del nuevo rol. 
    """
    chooose = False
    tipo = 'A'
    if request.method == 'POST':
        tipo = request.POST['tipoRol']
        if tipo == 'A':
            rol_form = RolAdmForm(request.POST)
        else:
            rol_form = RolOpForm(request.POST)
        if rol_form.is_valid():
            rol = Rol.objects.get_or_create(nombre=rol_form.cleaned_data['nombre'], descripcion=rol_form.cleaned_data['descripcion'], tipo=request.POST['tipoRol'])
            rol = Rol.objects.get(nombre=rol_form.cleaned_data['nombre'])
            #rol = Rol.objects.get(nombre=form.cleaned_data['nombre'])
            for perm in rol_form.cleaned_data['permisos']:
                rol.rol_permiso.add(perm)
            return HttpResponseRedirect('/rol_read/')#falta ak
    elif 'tipo' in request.GET:
        if request.GET['tipo'] == 'ad':
		#rol_perm
        #rol_edit_form = RolEditForm({'nombre': rol.nombre, 'descripcion': rol.descripcion, 'permisos': rol.rol_permiso.all()})
            rol_form = RolAdmForm()
            tipo = 'A'
        else:
            rol_form = RolOpForm()
            tipo = 'O'
        variables = RequestContext(request, {
            'chooose': False,
            'rol_form': rol_form,
			'tipo': tipo
        })
        return render_to_response('rol/rol_save.html', variables)
    else:
        rol_form = RolAdmForm()
        chooose = True
    variables = RequestContext(request, {
        'rol_form': rol_form,
		'choose': chooose,
        'tipo': tipo
    })
    return render_to_response('rol/rol_save.html', variables)

@login_required	
def editar_rol(request):
    """
    Vista que despliega los campos para modificar los datos de un rol existente. 
    """
    show_rol_list = False
    idRol = 1
    if request.method == 'POST':
        # formulario enviado
        idRol = request.POST['idRol']
        rol = Rol.objects.get(id=idRol)
        if rol.tipo == 'A':
            rol_edit_form = RolAdmForm(request.POST)
        else:
            rol_edit_form = RolOpForm(request.POST)
        #rol=Rol.objects.get(nombre=rol_edit_form.cleaned_data['nombre'])
        if rol_edit_form.is_valid():
            rol.nombre = rol_edit_form.cleaned_data['nombre']
            rol.descripcion = rol_edit_form.cleaned_data['descripcion']
            rol.rol_permiso.clear()
            for perm in rol_edit_form.cleaned_data['permisos']:
                rol.rol_permiso.add(perm)
            rol.save()
            return HttpResponseRedirect('/rol_edit/')
    elif 'rolname' in request.GET:
        rol = Rol.objects.get(nombre=request.GET['rolname'])
		#rol_perm
        #rol_edit_form = RolEditForm({'nombre': rol.nombre, 'descripcion': rol.descripcion, 'permisos': rol.rol_permiso.all()})
        dict = {}
        for perm in rol.rol_permiso.all():
            dict[perm.id] = True
        if rol.tipo == 'A':
            rol_edit_form = RolAdmForm(initial={'nombre': rol.nombre, 'descripcion': rol.descripcion, 'permisos':dict})
        else:
            rol_edit_form = RolOpForm(initial={'nombre': rol.nombre, 'descripcion': rol.descripcion, 'permisos':dict})
        idRol = rol.id
        #rol_edit_form.fields.permisos = rol.rol_permiso.all()
        roles = Rol.objects.all()
        variables = RequestContext(request, {
            'show_rol_list': False,
            'roles': roles,
            'idRol': idRol,
            'tipoadr': 'rol_edit',
            'rol_edit_form': rol_edit_form
        })
        return render_to_response('rol/editar_rol.html', variables)
    else:
        rol_edit_form = RolAdmForm()
        show_rol_list = True
    if 'buscar' in request.GET:
        searchform = SearchForm(request.GET)
        buscar = request.GET['buscar'].strip()
        roles = Rol.objects.all().exclude(id=1).exclude(id=2).filter(nombre__icontains=buscar)
    else:
        roles = Rol.objects.all().exclude(id=1).exclude(id=2)
        searchform = SearchForm() 
    variables = RequestContext(request, {
        'show_rol_list': show_rol_list,
        'roles': roles,
        'idRol': idRol,
        'tipoadr': 'rol_edit',
        'searchform': searchform,
        'rol_edit_form': rol_edit_form
    })
    return render_to_response('rol/editar_rol.html', variables)

@login_required
def leer_rol(request):
    """
    Vista que despliega una lista que contiene todos los roles existentes en el sistema. 
    """
    if request.method == 'POST':
        rol = Rol.objects.get(nombre=request.POST['rolname'])
        #rol.delete()
        return HttpResponseRedirect('/rol_read/')
    elif 'rolname' in request.GET:
        rol = Rol.objects.get(nombre=request.GET['rolname'])
        rol_edit_form = RolEditForm({'nombre': rol.nombre , 'descripcion': rol.descripcion, 'permisos':rol.rol_permiso.all()})
        roles = Rol.objects.all()
        variables = RequestContext(request, {
            'show_rol_list': False,
            'roles': roles,
            'tipoadr': 'rol_read',
            'rol_edit_form': rol_edit_form
        })
        return render_to_response('rol/read_rol.html', variables)
    else:
        rol_edit_form = RolEditForm()
    if 'buscar' in request.GET:
        searchform = SearchForm(request.GET)
        buscar = request.GET['buscar'].strip()
        roles = Rol.objects.all().filter(nombre__icontains=buscar)
    else:
        roles = Rol.objects.all()
        searchform = SearchForm() 
    variables = RequestContext(request, {
        'show_rol_list': True,
        'roles': roles,
        'searchform': searchform,
		'tipoadr': 'rol_read'
    })
    return render_to_response('rol/read_rol.html', variables)

@login_required
def eliminar_rol(request):
    """
    Vista que despliega una lista que contiene todos los roloes existentes en el sistema, los roles seleccionados
    podran ser eliminados. 
    """
    idRol = 1
    if request.method == 'POST':
        rol = Rol.objects.get(id=request.POST['idRol'])
        rol.delete()
        return HttpResponseRedirect('/rol_delete/')
    elif 'rolname' in request.GET:
        rol = Rol.objects.get(nombre=request.GET['rolname'])
        idRol = rol.id
        rol_edit_form = RolEditForm({'nombre': rol.nombre , 'descripcion': rol.descripcion, 'permisos':rol.rol_permiso.all()})
        roles = Rol.objects.all()
        variables = RequestContext(request, {
            'show_rol_list': False,
            'roles': roles,
            'tipoadr': 'rol_delete',
            'idRol': idRol,
            'rol_edit_form': rol_edit_form
        })
        return render_to_response('rol/delete_rol.html', variables)
    else:
        rol_edit_form = RolEditForm()
    if 'buscar' in request.GET:
        searchform = SearchForm(request.GET)
        buscar = request.GET['buscar'].strip()
        roles = Rol.objects.all().exclude(id=1).exclude(id=2).filter(nombre__icontains=buscar)
    else:
        roles = Rol.objects.all().exclude(id=1).exclude(id=2)
        searchform = SearchForm() 
    
    variables = RequestContext(request, {
        'show_rol_list': True,
        'roles': roles,
        'idRol': idRol,
        'searchform': searchform,
		'tipoadr': 'rol_delete'
    })
    return render_to_response('rol/delete_rol.html', variables)
		
@login_required
def asignar_rol_adm(request):
    """
    Vista desplegada para asignar roles administrativos.
    """
    usuario = Usuario.objects.get(username=request.user.username)#obtiene el usuario logueado actualmente
    perm = Permiso.objects.get(id=31)
    if not usuario.has_perm(perm):
        return HttpResponseRedirect('/restringido')
    if request.method == 'POST':
        rol_adm_form = RolAsAdForm(request.POST)
        idUser = request.POST['idUser']
        if rol_adm_form.is_valid():
            user = Usuario.objects.get(id=idUser)
            for rol in rol_adm_form.cleaned_data['roladm']:
                try:
                    UsRolPro.objects.get(usuario=user, rol=rol)
                except UsRolPro.DoesNotExist:
                    us_rol_proy = UsRolPro.objects.create(usuario=user, rol=rol)
            return HttpResponseRedirect('/user_save/success')
    elif 'username' in request.GET:
        user = Usuario.objects.get(username=request.GET['username'])
        idUser = user.id
        username = user.username
        dict = {}
        for rolpro in UsRolPro.objects.filter(usuario=user):
            dict[rolpro.rol.id] = True
        rol_adm_form = RolAsAdForm({'roladm':dict})
        variables = RequestContext(request, {
            'show_user_list': False,
            'username': username,
            'tipoadr': 'user_edit',
            'idUser': idUser,
            'rol_adm_form': rol_adm_form
        })
        return render_to_response('asing_adm.html', variables)
    else:
        rol_adm_form = RolAsAdForm()
    if 'buscar' in request.GET:
        searchform = SearchForm(request.GET)
        buscar = request.GET['buscar'].strip()
        usuarios = Usuario.objects.filter(is_active=True).filter(username__icontains=buscar)
    else:
        usuarios = Usuario.objects.filter(is_active=True)
        searchform = SearchForm() 
    
    variables = RequestContext(request, {
        'show_user_list': True,
        'usuarios': usuarios,
        'searchform': searchform,
        'tipoadr': 'asing_adm'
    })
    return render_to_response('asing_adm.html', variables)
